/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package SemanticoPacote;

import SemanticoPacote.TratamentoErroSemantico.ErroSemantico;

;
import compilador_full.TabelaSimbolos;

/**
 *
 * @author Fernanda
 */
public class ExpAtribuicaoFor {

    chamadaDeFuncao chamadaFuncao;

    public void sintaxeExpAtribuicaoFor(TabelaSimbolos tabelaSimbolos, String escopo) {



        if (tabelaSimbolos.getLookahead().equals("int")) {
            tabelaSimbolos.soConsome();//consome o int
        } else if (ehIdentificador(tabelaSimbolos) && tabelaSimbolos.superTipo(1).equals("identificador")) {

            if (!tabelaSimbolos.validaSeForInteiro(escopo, tabelaSimbolos.getLookahead())) {
                System.out.println("ERRO SEMANTICO - Modificar expressão de atribuição");
                ErroSemantico.getInstance().getTabelaErros().add("Erro Semântico na linha " +tabelaSimbolos.getLinha() + ". Descrição: Modificar expressão de atribuição");
            }


            tabelaSimbolos.soConsome();//consome o tipo de variavel criada pelo usuário
        }
        else{
            if (!tabelaSimbolos.validaNome(escopo, tabelaSimbolos.getLookahead()) ) {
                    System.out.println(" ERRO SEMANTICO - Variável " + tabelaSimbolos.getLookahead() + " não declarada - linha " + tabelaSimbolos.getLinha());
                    ErroSemantico.getInstance().getTabelaErros().add("Erro Semântico na linha " +tabelaSimbolos.getLinha() + ". Descrição: Variável não declarada");
                }
            else if(!tabelaSimbolos.validaSeForInteiro(escopo, tabelaSimbolos.getLookahead())){
                    System.out.println(" ERRO SEMANTICO - Variável " + tabelaSimbolos.getLookahead() + " não inteira - linha " + tabelaSimbolos.getLinha());
                    ErroSemantico.getInstance().getTabelaErros().add("Erro Semântico na linha " +tabelaSimbolos.getLinha() + ". Descrição: Tipo imcompatvítel com o tipo");
            }
        }
              

        tabelaSimbolos.soConsome();//consome a variável do lado esquerdo da atribuicao
        tabelaSimbolos.soConsome();//consome o =


        if (ehIdentificador(tabelaSimbolos)) {
            if (tabelaSimbolos.superLookahead(1).equals(";")) {

                if (!tabelaSimbolos.validaNome(escopo, tabelaSimbolos.getLookahead())) {
                    System.out.println(" ERRO SEMANTICO - Variável " + tabelaSimbolos.getLookahead() + " não declarada");
                    ErroSemantico.getInstance().getTabelaErros().add("Erro Semântico na linha " +tabelaSimbolos.getLinha() + ". Descrição: Variável não foi declarada");
                }

                tabelaSimbolos.soConsome();//consome identificador
                tabelaSimbolos.soConsome();//consome ;
            } else if (tabelaSimbolos.superLookahead(1).equals("(")) {
                chamadaFuncao = new chamadaDeFuncao(tabelaSimbolos);
                chamadaFuncao.chamaFuncao(escopo);

            }


        } else if (ehNumero(tabelaSimbolos) && tabelaSimbolos.superLookahead(1).equals(";")) {
            if (!Utils.tipoValor(tabelaSimbolos.getLookahead()).equals("int")) {
                System.out.println("ERRO SEMANTICO - Número " + tabelaSimbolos.getLookahead() + " não é inteiro");
                ErroSemantico.getInstance().getTabelaErros().add("Erro Semântico na linha " +tabelaSimbolos.getLinha() + ". Descrição: Imcompatibilidade de tipo de variavel");

            }

            tabelaSimbolos.soConsome();//consome numero
            tabelaSimbolos.soConsome();//consome ;
        } else if (verificaExpAritmetica(tabelaSimbolos)) {
           ExpressaoAritmetica expArit = new ExpressaoAritmetica();
            expArit.expAritmetica(tabelaSimbolos, escopo, "int");

            tabelaSimbolos.soConsome();//TEM QUE VER SE REALMENTE PRECISA CONSUMIR O ;
        }

    }

    public boolean ehIdentificador(TabelaSimbolos tabelaSimbolos) {
        if (tabelaSimbolos.getTipo().equals("identificador")) {
            return true;
        } else {
            return false;
        }
    }

    public boolean ehNumero(TabelaSimbolos tabelaSimbolos) {
        if (tabelaSimbolos.getTipo().equals("numero")) {
            return true;
        } else {
            return false;
        }
    }

    public boolean verificaExpAritmetica(TabelaSimbolos tabelaSimbolos) {

        if (tabelaSimbolos.getTipo().equals("identificador") || tabelaSimbolos.getTipo().equals("numero") ||
                tabelaSimbolos.getLookahead().equals("(")) {
            return true;
        } else {
            return false;
        }
    }
}
